/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package unmsm.fisi.tesis.si;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import org.apache.commons.digester.xmlrules.FromXmlRuleSet;
import org.eclipse.jdt.internal.compiler.ast.ThisReference;

import com.sun.accessibility.internal.resources.accessibility;

import unmsm.fisi.tesis.dao.CromosomaDAO;
import unmsm.fisi.tesis.entidad.Cromosoma;

/**
 *
 * @author Jhon
 */
public class Operadores implements Serializable{

	/**
	 * 
	 */
	private static final long serialVersionUID = -7026769669490346301L;
	private Cromosoma cromosoma_hijo1;
	private Cromosoma cromosoma_hijo2;
	private Cromosoma cromosoma_mutado;
	
	
	
	public Cromosoma getCromosoma_hijo1() {
		return cromosoma_hijo1;
	}

	public void setCromosoma_hijo1(Cromosoma cromosoma_hijo1) {
		this.cromosoma_hijo1 = cromosoma_hijo1;
	}

	public Cromosoma getCromosoma_hijo2() {
		return cromosoma_hijo2;
	}

	public void setCromosoma_hijo2(Cromosoma cromosoma_hijo2) {
		this.cromosoma_hijo2 = cromosoma_hijo2;
	}

	public Cromosoma getCromosoma_mutado() {
		return cromosoma_mutado;
	}

	public void setCromosoma_mutado(Cromosoma cromosoma_mutado) {
		this.cromosoma_mutado = cromosoma_mutado;
	}

	public List<Cromosoma>  crossover4(Cromosoma crom_padre,Cromosoma crom_madre, int generacionActual,int iteracion){
		
		
		int colum = crom_padre.getConocimiento()[0].length;
		int filas = crom_madre.getConocimiento().length;
		double numAleatorio;
		int puntoCorteFilaPadre,puntoCorteFilaMadre;
		
		int crom_primer_hijo[][]  = new int[filas][colum];
		int crom_segundo_hijo[][] = new int[filas][colum];
		
		//puntoCorteFilaPadre     = 11;
		numAleatorio = (double) (Math.random()*(filas));
		puntoCorteFilaPadre = (int)numAleatorio ;
		
		
		puntoCorteFilaMadre = filas- puntoCorteFilaPadre  ;
		
		
		////estaba comentado:
		
		/*int aux =	puntoCorteFila;
		puntoCorteFila    = puntoCorteColumna;
		puntoCorteColumna = aux;
		*/
		//puntoCorteFila    = 12;
		//puntoCorteColumna = 5;
		
		System.out.println("CROSS 4 Punto Corte---> C[puntoCorteFilaPadre:"+puntoCorteFilaPadre+"]");
		System.out.println("CROSS 4 Punto Corte---> C[puntoCorteFilaMadre:"+puntoCorteFilaMadre+"]");
			
		filas --;
		for (int i = 0; i <= filas; i++) {
			for (int j = 0; j < colum; j++) {
				
				//if(i < puntoCorteFila){
					
					/*if(j < puntoCorteColumna){
						crom_primer_hijo[i][colum - 1 -j]  = crom_madre.getConocimiento()[i][j];
						crom_segundo_hijo[i][ colum - 1 - j] = crom_padre.getConocimiento()[i][j];
					}else{
						crom_primer_hijo[i][colum - 1 -j]  = crom_padre.getConocimiento()[i][j];
						crom_segundo_hijo[i][colum - 1 -j] = crom_madre.getConocimiento()[i][j];
					}*/
					
				//}else{
					if(puntoCorteFilaPadre < puntoCorteFilaMadre){
						if(i<puntoCorteFilaPadre){
							crom_primer_hijo[i][j]  = crom_padre.getConocimiento()[i][j];
							crom_segundo_hijo[i][j] = crom_padre.getConocimiento()[filas - i][j];
						}else{
							
							crom_primer_hijo[i][j]  = crom_madre.getConocimiento()[i-puntoCorteFilaPadre][j];
							if(i< puntoCorteFilaMadre)
								crom_segundo_hijo[i][j] = crom_padre.getConocimiento()[filas - i][j];
							else
								crom_segundo_hijo[i][j] = crom_madre.getConocimiento()[puntoCorteFilaMadre + filas - i][j];
						}
					}else{
						if(i<puntoCorteFilaMadre){
							crom_segundo_hijo[i][j]  = crom_madre.getConocimiento()[i][j];
							crom_primer_hijo[i][j] = crom_madre.getConocimiento()[filas - i][j];
						}else{
							
							crom_segundo_hijo[i][j]  = crom_padre.getConocimiento()[i-puntoCorteFilaMadre][j];
							if(i< puntoCorteFilaPadre)
								crom_primer_hijo[i][j] = crom_madre.getConocimiento()[filas - i][j];
							else
								crom_primer_hijo[i][j] = crom_padre.getConocimiento()[puntoCorteFilaPadre+ filas - i][j];
						}
						
					}
				//}
			
			}
		}
		
		
		cromosoma_hijo1 = new Cromosoma();
		cromosoma_hijo1.setConocimiento(crom_primer_hijo);
		cromosoma_hijo1.setParentesco("Hijo");
		cromosoma_hijo1.setNumeroCromosoma(Constantes.NUMERO_CROMOSOMAS);
		cromosoma_hijo1.setGeneracionNacimiento(generacionActual);
		cromosoma_hijo1.setInteracionNacimiento(iteracion);
		cromosoma_hijo1.setPadre(crom_padre.getGeneracionNacimiento()+"-"+crom_padre.getNumeroCromosoma());
		cromosoma_hijo1.setMadre(crom_madre.getGeneracionNacimiento()+"-"+crom_madre.getNumeroCromosoma());
		Constantes.NUMERO_CROMOSOMAS++;
		
		cromosoma_hijo2 = new Cromosoma();
		cromosoma_hijo2.setConocimiento(crom_segundo_hijo);
		cromosoma_hijo2.setParentesco("Hijo");
		cromosoma_hijo2.setNumeroCromosoma(Constantes.NUMERO_CROMOSOMAS);
		cromosoma_hijo2.setGeneracionNacimiento(generacionActual);
		cromosoma_hijo2.setInteracionNacimiento(iteracion);
		cromosoma_hijo2.setPadre(crom_padre.getGeneracionNacimiento()+"-"+crom_padre.getNumeroCromosoma());
		cromosoma_hijo2.setMadre(crom_madre.getGeneracionNacimiento()+"-"+crom_madre.getNumeroCromosoma());
		Constantes.NUMERO_CROMOSOMAS++;
		
		List<Cromosoma> listaHijos = new ArrayList<Cromosoma>();
		listaHijos.add(cromosoma_hijo1);
		listaHijos.add(cromosoma_hijo2);
		
	
		return listaHijos;
	
   }
	
	public List<Cromosoma>  crossover3(Cromosoma crom_padre,Cromosoma crom_madre, int generacionActual, int iteracion){
		
		
		int colum = crom_padre.getConocimiento()[0].length;
		int filas = crom_madre.getConocimiento().length;
		double numAleatorio;
		int puntoCorteColumna,puntoCorteColumnaDos;
		
		int crom_primer_hijo[][]  = new int[filas][colum];
		int crom_segundo_hijo[][] = new int[filas][colum];
		
		numAleatorio = (double) (Math.random()*(colum));
		puntoCorteColumna = (int)numAleatorio ;
		
		//puntoCorteColumna = 5;
		
		numAleatorio= (double) (Math.random()*(filas));
		puntoCorteColumnaDos = (int)numAleatorio ;
		
		
		////estaba comentado:
		
		/*int aux =	puntoCorteFila;
		puntoCorteFila    = puntoCorteColumna;
		puntoCorteColumna = aux;
		*/
		//puntoCorteFila    = 12;
		//puntoCorteColumna = 5;
		
		System.out.println("CROSS 3 Punto Corte---> C[Columna:"+puntoCorteColumna+"]");
		
	
		for (int i = 0; i < filas; i++) {
			for (int j = 0; j < colum; j++) {
				
				//if(i < puntoCorteFila){
					
					/*if(j < puntoCorteColumna){
						crom_primer_hijo[i][colum - 1 -j]  = crom_madre.getConocimiento()[i][j];
						crom_segundo_hijo[i][ colum - 1 - j] = crom_padre.getConocimiento()[i][j];
					}else{
						crom_primer_hijo[i][colum - 1 -j]  = crom_padre.getConocimiento()[i][j];
						crom_segundo_hijo[i][colum - 1 -j] = crom_madre.getConocimiento()[i][j];
					}*/
					
				//}else{
					
					if(j<puntoCorteColumna){
						crom_primer_hijo[i][j]  = crom_padre.getConocimiento()[i][j];
						crom_segundo_hijo[i][j] = crom_madre.getConocimiento()[i][j];
					}else{
						crom_primer_hijo[i][j]  = crom_madre.getConocimiento()[i][j];
						crom_segundo_hijo[i][j] = crom_padre.getConocimiento()[i][j];
					}
				//}
			
			}
		}
		
		
		cromosoma_hijo1 = new Cromosoma();
		cromosoma_hijo1.setConocimiento(crom_primer_hijo);
		cromosoma_hijo1.setParentesco("Hijo");
		cromosoma_hijo1.setNumeroCromosoma(Constantes.NUMERO_CROMOSOMAS);
		cromosoma_hijo1.setGeneracionNacimiento(generacionActual);
		cromosoma_hijo1.setInteracionNacimiento(iteracion);
		cromosoma_hijo1.setPadre(crom_padre.getGeneracionNacimiento()+"-"+crom_padre.getNumeroCromosoma());
		cromosoma_hijo1.setMadre(crom_madre.getGeneracionNacimiento()+"-"+crom_madre.getNumeroCromosoma());
		Constantes.NUMERO_CROMOSOMAS++;
		
		cromosoma_hijo2 = new Cromosoma();
		cromosoma_hijo2.setConocimiento(crom_segundo_hijo);
		cromosoma_hijo2.setParentesco("Hijo");
		cromosoma_hijo2.setNumeroCromosoma(Constantes.NUMERO_CROMOSOMAS);
		cromosoma_hijo2.setGeneracionNacimiento(generacionActual);
		cromosoma_hijo2.setInteracionNacimiento(iteracion);
		cromosoma_hijo2.setPadre(crom_padre.getGeneracionNacimiento()+"-"+crom_padre.getNumeroCromosoma());
		cromosoma_hijo2.setMadre(crom_madre.getGeneracionNacimiento()+"-"+crom_madre.getNumeroCromosoma());
		Constantes.NUMERO_CROMOSOMAS++;
		
		List<Cromosoma> listaHijos = new ArrayList<Cromosoma>();
		listaHijos.add(cromosoma_hijo1);
		listaHijos.add(cromosoma_hijo2);
		
	
		return listaHijos;
	
   }
	
	public List<Cromosoma>  crossover2(Cromosoma crom_padre,Cromosoma crom_madre, int generacionActual, int iteracion){
		
		
		int colum = crom_padre.getConocimiento()[0].length;
		int filas = crom_madre.getConocimiento().length;
		double numAleatorio;
		int puntoCorteColumna,puntoCorteFila;
		
		int crom_primer_hijo[][]  = new int[filas][colum];
		int crom_segundo_hijo[][] = new int[filas][colum];
		
		numAleatorio = (double) (Math.random()*(colum));
		puntoCorteColumna = (int)numAleatorio ;
		
		numAleatorio= (double) (Math.random()*(filas));
		puntoCorteFila = (int)numAleatorio ;
		
		
		////estaba comentado:
		
		/*int aux =	puntoCorteFila;
		puntoCorteFila    = puntoCorteColumna;
		puntoCorteColumna = aux;
		*/
		//puntoCorteFila    = 12;
		//puntoCorteColumna = 5;
		
		System.out.println("CROSS 2 Punto Corte---> C["+puntoCorteFila+","+puntoCorteColumna+"]");
	
		for (int i = 0; i < filas; i++) {
			for (int j = 0; j < colum; j++) {
				
				if(i < puntoCorteFila){
					
					if(j < puntoCorteColumna){
						crom_primer_hijo[i][colum - 1 -j]  = crom_madre.getConocimiento()[i][j];
						crom_segundo_hijo[i][ colum - 1 - j] = crom_padre.getConocimiento()[i][j];
					}else{
						crom_primer_hijo[i][colum - 1 -j]  = crom_padre.getConocimiento()[i][j];
						crom_segundo_hijo[i][colum - 1 -j] = crom_madre.getConocimiento()[i][j];
					}
					
				}else{
					
					if(j<puntoCorteColumna){
						crom_primer_hijo[i][j]  = crom_padre.getConocimiento()[i][j];
						crom_segundo_hijo[i][j] = crom_madre.getConocimiento()[i][j];
					}else{
						crom_primer_hijo[i][j]  = crom_madre.getConocimiento()[i][j];
						crom_segundo_hijo[i][j] = crom_padre.getConocimiento()[i][j];
					}
				}
			
			}
		}
		
		
		cromosoma_hijo1 = new Cromosoma();
		cromosoma_hijo1.setConocimiento(crom_primer_hijo);
		cromosoma_hijo1.setParentesco("Hijo");
		cromosoma_hijo1.setNumeroCromosoma(Constantes.NUMERO_CROMOSOMAS);
		cromosoma_hijo1.setGeneracionNacimiento(generacionActual);
		cromosoma_hijo1.setInteracionNacimiento(iteracion);
		cromosoma_hijo1.setPadre(crom_padre.getGeneracionNacimiento()+"-"+crom_padre.getNumeroCromosoma());
		cromosoma_hijo1.setMadre(crom_madre.getGeneracionNacimiento()+"-"+crom_madre.getNumeroCromosoma());
		Constantes.NUMERO_CROMOSOMAS++;
		
		cromosoma_hijo2 = new Cromosoma();
		cromosoma_hijo2.setConocimiento(crom_segundo_hijo);
		cromosoma_hijo2.setParentesco("Hijo");
		cromosoma_hijo2.setNumeroCromosoma(Constantes.NUMERO_CROMOSOMAS);
		cromosoma_hijo2.setGeneracionNacimiento(generacionActual);
		cromosoma_hijo2.setInteracionNacimiento(iteracion);
		cromosoma_hijo2.setPadre(crom_padre.getGeneracionNacimiento()+"-"+crom_padre.getNumeroCromosoma());
		cromosoma_hijo2.setMadre(crom_madre.getGeneracionNacimiento()+"-"+crom_madre.getNumeroCromosoma());
		Constantes.NUMERO_CROMOSOMAS++;
		
		List<Cromosoma> listaHijos = new ArrayList<Cromosoma>();
		listaHijos.add(cromosoma_hijo1);
		listaHijos.add(cromosoma_hijo2);
		
	
		return listaHijos;
	
   }
	
	public List<Cromosoma>  crossover1(Cromosoma crom_padre,Cromosoma crom_madre, int generacionActual, int iteracion){
		
		
		int colum = crom_padre.getConocimiento()[0].length;
		int filas = crom_madre.getConocimiento().length;
		double numAleatorio;
		int puntoCorteColumna,puntoCorteFila;
		
		int crom_primer_hijo[][]  = new int[filas][colum];
		int crom_segundo_hijo[][] = new int[filas][colum];
		
		numAleatorio = (double) (Math.random()*(colum));
		puntoCorteColumna = (int)numAleatorio ;
		
		numAleatorio= (double) (Math.random()*(filas));
		puntoCorteFila = (int)numAleatorio ;
		
		/*int aux =	puntoCorteFila;
		puntoCorteFila    = puntoCorteColumna;
		puntoCorteColumna = aux;
		*/
		//puntoCorteFila    = 5;
		//puntoCorteColumna = 12;
		
		System.out.println("Punto Corte---> C["+puntoCorteFila+","+puntoCorteColumna+"]");
	
		for (int i = 0; i < filas; i++) {
			for (int j = 0; j < colum; j++) {
				
				if(i < puntoCorteFila){
					
					if(j < puntoCorteColumna){
						crom_primer_hijo[i][j]  = crom_padre.getConocimiento()[i][j];
						crom_segundo_hijo[i][j] = crom_madre.getConocimiento()[i][j];
					}else{
						crom_primer_hijo[i][j]  = crom_madre.getConocimiento()[i][j];
						crom_segundo_hijo[i][j] = crom_padre.getConocimiento()[i][j];
					}
					
				}else{
					
					if(j<puntoCorteColumna){
						crom_primer_hijo[i][j]  = crom_madre.getConocimiento()[i][j];
						crom_segundo_hijo[i][j] = crom_padre.getConocimiento()[i][j];
					}else{
						crom_primer_hijo[i][j]  = crom_padre.getConocimiento()[i][j];
						crom_segundo_hijo[i][j] = crom_madre.getConocimiento()[i][j];
					}
				}
			
			}
		}
		
		
		cromosoma_hijo1 = new Cromosoma();
		cromosoma_hijo1.setConocimiento(crom_primer_hijo);
		cromosoma_hijo1.setParentesco("Hijo");
		cromosoma_hijo1.setNumeroCromosoma(Constantes.NUMERO_CROMOSOMAS);
		cromosoma_hijo1.setGeneracionNacimiento(generacionActual);
		cromosoma_hijo1.setInteracionNacimiento(iteracion);
		cromosoma_hijo1.setPadre(crom_padre.getGeneracionNacimiento()+"-"+crom_padre.getNumeroCromosoma());
		cromosoma_hijo1.setMadre(crom_madre.getGeneracionNacimiento()+"-"+crom_madre.getNumeroCromosoma());
		Constantes.NUMERO_CROMOSOMAS++;
		
		cromosoma_hijo2 = new Cromosoma();
		cromosoma_hijo2.setConocimiento(crom_segundo_hijo);
		cromosoma_hijo2.setParentesco("Hijo");
		cromosoma_hijo2.setNumeroCromosoma(Constantes.NUMERO_CROMOSOMAS);
		cromosoma_hijo2.setGeneracionNacimiento(generacionActual);
		cromosoma_hijo2.setInteracionNacimiento(iteracion);
		cromosoma_hijo2.setPadre(crom_padre.getGeneracionNacimiento()+"-"+crom_padre.getNumeroCromosoma());
		cromosoma_hijo2.setMadre(crom_madre.getGeneracionNacimiento()+"-"+crom_madre.getNumeroCromosoma());
		Constantes.NUMERO_CROMOSOMAS++;
		
		List<Cromosoma> listaHijos = new ArrayList<Cromosoma>();
		listaHijos.add(cromosoma_hijo1);
		listaHijos.add(cromosoma_hijo2);
		
	
		return listaHijos;
	
   }
	
	public List<Cromosoma> mutacion1Punto(Cromosoma crom_padre, int generacionActual, int iteracion){
		
		double numAleatorio;
		int filas = crom_padre.getConocimiento().length;
		int colum = crom_padre.getConocimiento()[0].length;
		int crom_hijo_mutado[][] = new int[filas][colum];	
		numAleatorio= (double) (Math.random()*(colum));
		int puntoCorteColumna = (int)numAleatorio ;
		
		numAleatorio= (double) (Math.random()*(filas));
		int puntoCorteFila = (int)numAleatorio ;
		
		for (int i = 0; i < filas; i++) {
			for (int j = 0; j < colum; j++) {
				
				crom_hijo_mutado[i][j] = crom_padre.getConocimiento()[i][j];
			}
		}
		
		crom_hijo_mutado[puntoCorteFila][puntoCorteColumna] = 1 - crom_hijo_mutado[puntoCorteFila][puntoCorteColumna] ;
		
		System.out.println("Posicion Cambiada ---> C["+puntoCorteFila+":"+puntoCorteColumna+"]");
		Cromosoma cromoHijoMutado = new Cromosoma();
		cromoHijoMutado.setConocimiento(crom_hijo_mutado);
		cromoHijoMutado.setNumeroCromosoma(Constantes.NUMERO_CROMOSOMAS);
		cromoHijoMutado.setParentesco("Hijo_Mutado");
		cromoHijoMutado.setGeneracionNacimiento(generacionActual);
		cromoHijoMutado.setInteracionNacimiento(iteracion);
		cromoHijoMutado.setPadre(crom_padre.getGeneracionNacimiento()+"-"+crom_padre.getNumeroCromosoma());
		Constantes.NUMERO_CROMOSOMAS++;
		
		List<Cromosoma> listaHijosCromosomas = new ArrayList<Cromosoma>();
		listaHijosCromosomas.add(cromoHijoMutado);
		return listaHijosCromosomas;
	}
	
	public List<Cromosoma> mutacion2Puntos(Cromosoma crom_padre, int generacionActual, int iteracion){
		
		double numAleatorio=0.0;
		int filas = crom_padre.getConocimiento().length;
		int colum = crom_padre.getConocimiento()[0].length;
		int crom_hijo_mutado[][] = new int[filas][colum];	
		
		numAleatorio= (double) (Math.random()*(colum));
		int puntoCorteColumna1 = (int)numAleatorio ;
		numAleatorio= (double) (Math.random()*(filas));
		int puntoCorteFila1 = (int)numAleatorio ;
		
		numAleatorio= (double) (Math.random()*(colum));
		int puntoCorteColumna2 = (int)numAleatorio ;
		numAleatorio= (double) (Math.random()*(filas));
		int puntoCorteFila2 = (int)numAleatorio ;
		
		for (int i = 0; i < filas; i++) {
			for (int j = 0; j < colum; j++) {
				
				crom_hijo_mutado[i][j] = crom_padre.getConocimiento()[i][j];
			}
		}
		
		crom_hijo_mutado[puntoCorteFila1][puntoCorteColumna1] = 1 - crom_hijo_mutado[puntoCorteFila1][puntoCorteColumna1] ;
		crom_hijo_mutado[puntoCorteFila2][puntoCorteColumna2] = 1 - crom_hijo_mutado[puntoCorteFila2][puntoCorteColumna2] ;
		
		System.out.println("Posicion Cambiada 1---> C["+puntoCorteFila1+":"+puntoCorteColumna1+"]");
		System.out.println("Posicion Cambiada 1---> C["+puntoCorteFila2+":"+puntoCorteColumna2+"]");
		Cromosoma cromoHijoMutado = new Cromosoma();
		cromoHijoMutado.setConocimiento(crom_hijo_mutado);
		cromoHijoMutado.setNumeroCromosoma(Constantes.NUMERO_CROMOSOMAS);
		cromoHijoMutado.setParentesco("Hijo_Mutado");
		cromoHijoMutado.setGeneracionNacimiento(generacionActual);
		cromoHijoMutado.setInteracionNacimiento(iteracion);
		cromoHijoMutado.setPadre(crom_padre.getGeneracionNacimiento()+"-"+crom_padre.getNumeroCromosoma());
		Constantes.NUMERO_CROMOSOMAS++;
		
		List<Cromosoma> listaHijosCromosomas = new ArrayList<Cromosoma>();
		listaHijosCromosomas.add(cromoHijoMutado);
		return listaHijosCromosomas;
	}
	
	public static void main(String args[]){
	/*	
  int [][] genes1=
   			      {{9,9,9,9,9,2,2,2,2,2,2,2,2,2,2},
		     	   {9,9,9,9,9,2,2,2,2,2,2,2,2,2,2},
				   {9,9,9,9,9,2,2,2,2,2,2,2,2,2,2},
				   {9,9,9,9,9,2,2,2,2,2,2,2,2,2,2},
				   {9,9,9,9,9,2,2,2,2,2,2,2,2,2,2},
				   {9,9,9,9,9,2,2,2,2,2,2,2,2,2,2},
				   {9,9,9,9,9,2,2,2,2,2,2,2,2,2,2},
				   {9,9,9,9,9,2,2,2,2,2,2,2,2,2,2},
				   {9,9,9,9,9,2,2,2,2,2,2,2,2,2,2},
				   {9,9,9,9,9,2,2,2,2,2,2,2,2,2,2},
				   {9,9,9,9,9,2,2,2,2,2,2,2,2,2,2},
				   {9,9,9,9,9,2,2,2,2,2,2,2,2,2,2},
				   {1,1,1,1,1,5,5,5,5,5,5,5,5,5,5},
				   {1,1,1,1,1,5,5,5,5,5,5,5,5,5,5},
				   {1,1,1,1,1,5,5,5,5,5,5,5,5,5,5},
				   {1,1,1,1,1,5,5,5,5,5,5,5,5,5,5},
				   {1,1,1,1,1,5,5,5,5,5,5,5,5,5,5},
				   {1,1,1,1,1,5,5,5,5,5,5,5,5,5,5},
				   {1,1,1,1,1,5,5,5,5,5,5,5,5,5,5},
				   {1,1,1,1,1,5,5,5,5,5,5,5,5,5,5},
				   {1,1,1,1,1,5,5,5,5,5,5,5,5,5,5}};
	
  int [][] genes2={{4,4,4,4,4,3,3,3,3,3,3,3,3,3,3},
    	   		   {4,4,4,4,4,3,3,3,3,3,3,3,3,3,3},
				   {4,4,4,4,4,3,3,3,3,3,3,3,3,3,3},
				   {4,4,4,4,4,3,3,3,3,3,3,3,3,3,3},
				   {4,4,4,4,4,3,3,3,3,3,3,3,3,3,3},
				   {4,4,4,4,4,3,3,3,3,3,3,3,3,3,3},
				   {4,4,4,4,4,3,3,3,3,3,3,3,3,3,3},
				   {4,4,4,4,4,3,3,3,3,3,3,3,3,3,3},
				   {4,4,4,4,4,3,3,3,3,3,3,3,3,3,3},
				   {4,4,4,4,4,3,3,3,3,3,3,3,3,3,3},
				   {4,4,4,4,4,3,3,3,3,3,3,3,3,3,3},
				   {4,4,4,4,4,3,3,3,3,3,3,3,3,3,3},
				   {7,7,7,7,7,8,8,8,8,8,8,8,8,8,8},
				   {7,7,7,7,7,8,8,8,8,8,8,8,8,8,8},
				   {7,7,7,7,7,8,8,8,8,8,8,8,8,8,8},
				   {7,7,7,7,7,8,8,8,8,8,8,8,8,8,8},
				   {7,7,7,7,7,8,8,8,8,8,8,8,8,8,8},
				   {7,7,7,7,7,8,8,8,8,8,8,8,8,8,8},
				   {7,7,7,7,7,8,8,8,8,8,8,8,8,8,8},
				   {7,7,7,7,7,8,8,8,8,8,8,8,8,8,8},
				   {7,7,7,7,7,8,8,8,8,8,8,8,8,8,8}};
  	*/
  	
		int [][] genes1=
			      {{9,9,9,9,9,2,2,2,2,2,2,2,2,2,2},
	     	   {9,9,9,9,9,2,2,2,2,2,2,2,2,2,2},
			   {9,9,9,9,9,2,2,2,2,2,2,2,2,2,2},
			   {9,9,9,9,9,2,2,2,2,2,2,2,2,2,2},
			   {9,9,9,9,9,2,2,2,2,2,2,2,2,2,2},
			   {9,9,9,9,9,2,2,2,2,2,2,2,2,2,2},
			   {9,9,9,9,9,2,2,2,2,2,2,2,2,2,2},
			   {9,9,9,9,9,2,2,2,2,2,2,2,2,2,2},
			   {9,9,9,9,9,2,2,2,2,2,2,2,2,2,2},
			   {9,9,9,9,9,2,2,2,2,2,2,2,2,2,2},
			   {9,9,9,9,9,2,2,2,2,2,2,2,2,2,2},
			   {9,9,9,9,9,2,2,2,2,2,2,2,2,2,2},
			   {1,1,1,1,1,5,5,5,5,5,5,5,5,5,5},
			   {1,1,1,1,1,5,5,5,5,5,5,5,5,5,5},
			   {1,1,1,1,1,5,5,5,5,5,5,5,5,5,5},
			   {1,1,1,1,1,5,5,5,5,5,5,5,5,5,5},
			   {1,1,1,1,1,5,5,5,5,5,5,5,5,5,5},
			   {1,1,1,1,1,5,5,5,5,5,5,5,5,5,5},
			   {1,1,1,1,1,5,5,5,5,5,5,5,5,5,5},
			   {1,1,1,1,1,5,5,5,5,5,5,5,5,5,5},
			   {1,1,1,1,1,5,5,5,5,5,5,5,5,5,5}};

int [][] genes2={{4,4,4,4,4,3,3,3,3,3,3,3,3,3,3},
	   		   {4,4,4,4,4,3,3,3,3,3,3,3,3,3,3},
			   {4,4,4,4,4,3,3,3,3,3,3,3,3,3,3},
			   {4,4,4,4,4,3,3,3,3,3,3,3,3,3,3},
			   {4,4,4,4,4,3,3,3,3,3,3,3,3,3,3},
			   {4,4,4,4,4,3,3,3,3,3,3,3,3,3,3},
			   {4,4,4,4,4,3,3,3,3,3,3,3,3,3,3},
			   {4,4,4,4,4,3,3,3,3,3,3,3,3,3,3},
			   {4,4,4,4,4,3,3,3,3,3,3,3,3,3,3},
			   {4,4,4,4,4,3,3,3,3,3,3,3,3,3,3},
			   {4,4,4,4,4,3,3,3,3,3,3,3,3,3,3},
			   {4,4,4,4,4,3,3,3,3,3,3,3,3,3,3},
			   {7,7,7,7,7,8,8,8,8,8,8,8,8,8,8},
			   {7,7,7,7,7,8,8,8,8,8,8,8,8,8,8},
			   {7,7,7,7,7,8,8,8,8,8,8,8,8,8,8},
			   {7,7,7,7,7,8,8,8,8,8,8,8,8,8,8},
			   {7,7,7,7,7,8,8,8,8,8,8,8,8,8,8},
			   {7,7,7,7,7,8,8,8,8,8,8,8,8,8,8},
			   {7,7,7,7,7,8,8,8,8,8,8,8,8,8,8},
			   {7,7,7,7,7,8,8,8,8,8,8,8,8,8,8},
			   {7,7,7,7,7,8,8,8,8,8,8,8,8,8,8}};
	
  	
      Cromosoma cromosoma1= new Cromosoma();
      Cromosoma cromosoma2= new Cromosoma();
      Cromosoma cromosoma3= new Cromosoma();
      
      
      cromosoma1.setConocimiento(genes1);
      cromosoma2.setConocimiento(genes2);
      
      Operadores operadores= new Operadores();
      List<Cromosoma> cromosomasHijos= operadores.crossover4(cromosoma1, cromosoma2,1,1);
      //List<Cromosoma> cromosomasHijo2= operadores.mutacion(cromosoma1, new StringBuilder(),1);
     
      //operadores.mostrar(cromosoma3);
      System.out.println("PADRES");
      operadores.mostrar(cromosoma1);
      operadores.mostrar(cromosoma2);
      
      System.out.println("HIJOS GENERADOS");
      
      for (int i = 0; i < cromosomasHijos.size(); i++) {
    	  for (int j = 0; j < cromosomasHijos.get(i).getConocimiento().length; j++) {
			for (int j2 = 0; j2 < cromosomasHijos.get(i).getConocimiento()[0].length; j2++) {
				System.out.print(cromosomasHijos.get(i).getConocimiento()[j][j2]+ ",");
			}
			System.out.println("");
		}
    	  System.out.println("");
    	  System.out.println("");
      }
      

	}
	
	public void mostrar(Cromosoma cromosoma){
		
		for (int j1 = 0; j1 <  cromosoma.getConocimiento().length; j1++) {

			for (int j2 = 0; j2 < cromosoma.getConocimiento()[j1].length; j2++) {
				System.out.print(cromosoma.getConocimiento()[j1][j2] + ",");
			}
			System.out.print("\n");

		}
		System.out.print("\n");
		System.out.print("\n");
	}
	
	
	
}
